package fsmsim.dataStructure;

import java.util.Vector;

/**
 * <p>Title: FSMSim</p>
 *
 * <p>Description: Simulatore di macchine a stati finiti.</p>
 *
 * <p>Copyright: Copyright (c) 2008</p>
 *
 * <p>Company: Bollati, Donati, Gabrielli, Peli</p>
 *
 * @author Bollati, Donati, Gabrielli, Peli
 * @version 3.0
 */

public class ContainerVector implements Container {

    private Vector<Element> data;

    /**
     * Costruttore
     */

    public ContainerVector() {
        data = new Vector<Element>();
    }
    
    
    /**
     * Restituisce il contenitore 
     * @return
     */
    
    public Vector<Element> getData() {
        return this.data;
    }

    
    /**
     * Aggiunge un elemento nel contenitore
     * @param aElement
     */

    public void addElement(Element aElement) {
        getData().addElement(aElement);
    }
    
    
    /**
     * Aggiunge un elemento nel contenitore in una determinata posizione
     * @param aElement
     * @param position
     */
    
    public void addElement(Element aElement,int position) {
        this.getData().add(position, aElement);
    }

    
    /**
     * Elimina un elemento dal contenitore
     * @param aElement
     */

    public void removeElement(Element aElement) {
        getData().removeElement(aElement);
    }

    
    /**
     * Restituisce gli elementi che fanno matchElement con l'elemento passato 
     * @param aElement
     * @return
     */

    public Container searchElement(Element aElement) {

        ContainerVector tempVectorContainer = new ContainerVector();

        for (int i = 0; i < getData().size(); i++) {
            if ((aElement.getElement(Transition.INITIAL_STATE).
                    matchElement((State)getData().get(i).getElement(Transition.INITIAL_STATE)))
                    && (aElement.getElement(Transition.INPUT_EVENT).
                    matchElement(getData().get(i).getElement(Transition.INPUT_EVENT)))) {
                tempVectorContainer.addElement(getData().get(i));
            }
        }

        // pulisci il vector e se non è vuoto mandalo in uscita
        if (tempVectorContainer.size() != 0) {
            return tempVectorContainer;
        }
        return null;
    }

    
    /**
     * Preleva un elemento dal contenitore
     * @return
     */

    public Element drawElement() {
        if (getData().size() == 0) {
            return null;
        }
        Element element = getData().get(0);
        getData().remove(0);
        return element;
    }

    
    /**
     * Ritorna l'indice di un elemento presente nel contenitore
     * @param aElement
     * @return
     */

    public int indexOfElement(Element aElement) {
        int i;
        for (i = 0; i < getData().size(); i++) {
            if (((getData().get(i).getName()).compareTo(aElement.getName())) == 0) {
                break;
            }
        }
        return i;
    }

    
    /**
     * Ritorna l'elemento ad un certo indice
     * @param index
     * @return
     */

    public Element getElement(int index) {
        return getData().get(index);
    }

    
    /**
     * Ritorna la lunghezza del contenitore
     * @return
     */

    public int size() {
        return getData().size();
    }

    
    /**
     * Metodo toString
     * @return
     */

    @Override
    public String toString() {
        String s = "";
        for (int i = 0; i < getData().size(); i++) {
            if (getData().get(i) == null)
                s += " ";
            else 
                s += getData().get(i).toString() + " ";
        }
        return s;
    }
    
    
    /**
     * Verifica che l'elemento passato è contenuto nel data
     * @param aElement
     * @return
     */
    
    public boolean containsElement(Element aElement) {
        for (int i = 0 ; i < data.size() ; i++) {
          if(this.data.get(i)!= null) 
            if (this.data.get(i).getName().compareTo(aElement.getName()) == 0)
                return true;
        }
        return false;
    }

}
